\subsubsection{MSVC: x86-64}

\myindex{x86-64}
Попробуем также 64-битный MSVC:

\lstinputlisting[caption=MSVC 2012 x64,style=customasmx86]{patterns/01_helloworld/MSVC_x64.asm}

\myindex{fastcall}

В x86-64 все регистры были расширены до 64-х бит и теперь имеют префикс \TT{R-}.
Чтобы поменьше задействовать стек (иными словами, поменьше обращаться кэшу и внешней памяти), уже давно имелся
довольно популярный метод передачи аргументов функции через регистры (\IT{fastcall}) \myref{fastcall}.
Т.е. часть аргументов функции передается через регистры и часть ---через стек.
В Win64 первые 4 аргумента функции передаются через регистры \RCX, \RDX, \Reg{8}, \Reg{9}.
Это мы здесь и видим: указатель на строку в \printf теперь передается не через стек, а через регистр \RCX.
Указатели теперь 64-битные, так что они передаются через 64-битные части регистров (имеющие префикс \TT{R-}).
Но для обратной совместимости можно обращаться и к нижним 32 битам регистров используя префикс \TT{E-}.
Вот как выглядит регистр \RAX/\EAX/\AX/\AL в x86-64:

\RegTableOne{RAX}{EAX}{AX}{AH}{AL}

Функция \main возвращает значение типа \Tint, который в \CCpp, надо полагать, для лучшей совместимости и переносимости,
оставили 32-битным. Вот почему в конце функции \main обнуляется не \RAX, а \EAX, т.е. 32-битная часть регистра.
Также видно, что 40 байт выделяются в локальном стеке.
Это \q{shadow space} которое мы будем рассматривать позже: \myref{shadow_space}.
